#include "Qsci/qsciapis.h"
#include "Qsci/qscilexer.h"
#include "Qsci/qscilexercss.h"
#include <QApplication>

#include <Qsci/qsciscintilla.h>
#include <qcolor.h>
#include <qnamespace.h>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    // 编辑器类
    QsciScintilla editor;
    editor.setText("Hello QSciScintilla!");
    editor.show();
    
    // 设置语法
    {
    // QsciLexerCSS textLexer;
    // editor.setLexer(&textLexer);
    // textLexer.setPaper(QColor(33, 37,50));
    // textLexer.setColor(QColor(0,170,0), QsciLexerCSS::Comment);
    // textLexer.setPaper(QColor(Qt::white), QsciLexerCSS::Tag);
    // textLexer.setPaper(QColor(Qt::white), QsciLexerCSS::IDSelector);

    // 代码提示
    // QsciAPIs apis(&textLexer);
    // apis.add(QString("zinface"));
    // apis.add(QString("mofa"));
    // apis.prepare();
    }

    // 编码行为
    editor.SendScintilla(QsciScintilla::SCI_SETCODEPAGE, QsciScintilla::SC_CP_UTF8);

    // 行号提示
    QFont line_font("Consolas", 16);
    editor.setFont(line_font);

    // 自动换行
    editor.setWrapMode(QsciScintilla::WrapWord);
    // editor.setWrapVisualFlags(QsciScintilla::WrapFlagByText);

    // 此时空格不显示
    editor.setWhitespaceVisibility(QsciScintilla::WsInvisible);
    editor.setWhitespaceSize(4); // 空格点大小

    // indent
    {
        // 使用空格缩进
        editor.setIndentationsUseTabs(false); 
        // 宽度为4个空格
        editor.setTabWidth(4); 
        // 显示缩进线
        editor.setIndentationGuides(true); 
        // 如果在行首部空格位置tab，缩进的宽度字符数，并且不会转换为空格
        editor.setIndentationWidth(0); // 缩进宽度, 0表示使用tab
        //换行后自动缩进
        editor.setAutoIndent(true);
        
        // 退格是否退格到上一行
        editor.setBackspaceUnindents(true);  
        // 是否对齐缩进
        editor.setTabIndents(true); 
        
        // 括号匹配
        editor.setBraceMatching(QsciScintilla::SloppyBraceMatch); // 严格匹配
    }

    //current line color
    {
        // 光标宽度，0表示不显示光标
        editor.setCaretWidth(2);
        // 光标颜色
        editor.setCaretForegroundColor(QColor("#AEAFAD"));
        // 是否高亮显示光标所在行
        editor.setCaretLineVisible(true);
        // 光标所在行背景颜色
        editor.setCaretLineBackgroundColor(Qt::color0);
    }

    //selection color
    {
        // 选中文本背景色
        editor.setSelectionBackgroundColor(QColor("#264F78"));
        // 选中文本前景色
        editor.setSelectionForegroundColor(Qt::color0);
    }

    //edge
    {
        //editor.setEdgeColumn(50); // edge宽度，没发现有啥用
        //editor.setEdgeMode(QsciScintilla::EdgeLine);
        //editor.setEdgeColor(QColor("green"));
    }

    QFont margin_font;
    margin_font.setFamily("Consolas");
    margin_font.setPointSize(16);//边栏字体设置px我这里显示不出行号，不知道是怎么回事
    editor.setMarginsFont(margin_font);//设置页边字体
    editor.setMarginType(0,QsciScintilla::NumberMargin);//设置标号为0的页边显示行号
    //editor.setMarginMarkerMask(0,QsciScintilla::Background);//页边掩码
    //editor.setMarginSensitivity(0,true);//注册通知事件，当用户点击边栏时，scintilla会通知我们
    editor.setMarginLineNumbers(0,true);//设置第0个边栏为行号边栏，True表示显示
    editor.setMarginWidth(0,15);//设置0边栏宽度
    editor.setMarginsBackgroundColor(Qt::gray);
    editor.setMarginsForegroundColor(Qt::white);

    // 折叠样式
    editor.setFolding(QsciScintilla::BoxedTreeFoldStyle);
    // 折叠栏颜色
    editor.setFoldMarginColors(Qt::gray,Qt::lightGray);

    //auto complete
    {
        // Acs[None|All|Document|APIs]
        // 禁用自动补全提示功能|所有可用的资源|当前文档中出现的名称都自动补全提示|使用QsciAPIs类加入的名称都自动补全提示
        // 自动补全。对于所有Ascii字符
        editor.setAutoCompletionSource(QsciScintilla::AcsAll);
        // 大小写敏感度，设置lexer可能会更改，不过貌似没啥效果
        // editor.setAutoCompletionCaseSensitivity(false);
        // 设置每输入一个字符就会出现自动补全的提示
        editor.setAutoCompletionThreshold(1);
        // 是否用补全的字符串替代光标右边的字符串
        // editor.setAutoCompletionReplaceWord(false);
    }



    return app.exec();
}
